package com.dandelion.shiro;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;

import com.dandelion.commons.utils.PropertyUtils;


public class ShiroPasswordHelper {

	private static String applicationSalt = PropertyUtils.getValue("shiro.applicationSalt");
	private static String hashAlgorithmName = PropertyUtils.getValue("shiro.hashAlgorithmName");
	private static int hashIterations = Integer.valueOf(PropertyUtils.getValue("shiro.hashIterations"));
	private static boolean storedCredentialsHexEncoded = Boolean.valueOf(PropertyUtils.getValue("shiro.storedCredentialsHexEncoded"));

	/**
	 * 将输入的密码进行特殊处理，防止密码轻易被破解，增强应用的安全性 密码 + 常量 +用户名
	 * @param password 需要加密的字符串
	 * @param username 用户名
	 * @param salt 加密盐
	 * @return 返回加密后的密码字符串
	 */
	public static String encodePassword(final String password, final String username, final String userSalt) {
		if (storedCredentialsHexEncoded) {
			return new SimpleHash(hashAlgorithmName, password, ByteSource.Util.bytes(applicationSalt + username + userSalt), hashIterations).toHex();
		} else {
			return new SimpleHash(hashAlgorithmName, password, ByteSource.Util.bytes(applicationSalt + username + userSalt), hashIterations).toString();
		}
	}
	
	/**
	 * 判断输入的密码是否与应用中存储的密码相符合。因为应用中存储的密码是由输入的密码经过特殊处理后生成的， 所以需要我们自己定义如何判断输入的密码和存储的密码的一致性
	 * @param encPass 加密后的字符串
	 * @param password 需要加密的字符串
	 * @param username 用户名
	 * @param userSalt 加密盐
	 * @return 加密后的字符串和传入的字符串是否相同
	 */
	public static boolean isPasswordValid(final String encPass, final String password, final String username, final String userSalt) {
		if (storedCredentialsHexEncoded) {
			return new SimpleHash(hashAlgorithmName, password, applicationSalt + userSalt + username, hashIterations).toHex().equals(encPass);
		} else {
			return new SimpleHash(hashAlgorithmName, password, applicationSalt + userSalt + username, hashIterations).toString().equals(encPass);
		}
	}
}
